<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
    
</body>
<script>

    // 关键字：new

    // 执行函数的一种方式：new 函数名

    // new的原理：
        // 1. 创建一个新对象
        // 2. 改变原函数的this指向，指向这个新对象
        // 3. 修改新对象的原型链指向，指向了函数的prototype
        // 4. 执行原函数内所有代码
        // 5. 检测原函数是否主动返回对象，如果没有，那么自动返回this

    // 演示new的功能
    // function fn(m){
    //     // console.log("hello world")
    //     this.msg = m;
    //     console.log(this);

    //     return ["hello", "world"]
    // }
    // const res1 = new fn("hahah");
    // console.log(res1)
    // const res2 = new fn;
    // console.log(res2)

    // const res3 = fn();
    // console.log(res3)

    // ========

    // 类
    function fn(name, age, sex){
        // 加工
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    // fn.专属属性就是一个对象
    // 专属属性：prototype

    // 接口规范
    fn.prototype.sayHello = function(){
        console.log(this.name)
    }
    // fn.prototype.xxx = function(){}

    // 实例化
    const f1 = new fn("admin", 18, "男");
    console.log(f1);
    f1.sayHello();

    const f2 = new fn("root", 20, "女");
    console.log(f2);
    f2.sayHello();

    // 每个实例身上的方法使用的是同一个接口规范的定义（相等）
    console.log(f1.sayHello === f2.sayHello);

    
</script>
</html>